package com.sp.homework;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 1. 编写客户端和服务器端程序
 * 2. 客户端可以输入一个音乐文件名, 比如高山流水, 服务端收到音乐名后, 可以给客户端返回这个音乐文件,
 *    如果服务端没有这个文件, 返回一个默认的音乐
 * 3. 客户端收到文件后, 保存到"d:\\development\\code\\IO_Test\\news\\"下
 * 4. 提示: 可以使用StreamUtils.java自定义工具类
 */
public class Homework03Server {
    public static void main(String[] args) throws Exception {

        //1. 监听9999端口
        ServerSocket serverSocket = new ServerSocket(9999);

        //2. 等待客户端连接
        System.out.println("服务端, 在9999端口监听");
        Socket socket = serverSocket.accept();

        //3. 读取客户端发送要下载的文件名
        InputStream inputStream = socket.getInputStream();
        byte[] b = new byte[1024];
        int len = 0;
        String downloadFileName = "";
        while ((len = inputStream.read(b)) != -1) {
            downloadFileName += new String(b, 0, len);
        }
        System.out.println("客户端想要下载: " + downloadFileName);
        String resFileName = "";
        if (downloadFileName.equals("高山流水")) {
            resFileName = "d:\\development\\code\\IO_Test\\news\\1.mp3";
        } else {
            resFileName = "d:\\development\\code\\IO_Test\\news\\1.mp3";
        }

        //4. 创建一个输入流, 读取文件
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(resFileName));

        //5. 使用工具类StreamUtils, 读取文件到一个字节数组
        byte[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);

        //6. 得到Socket关联的输出流
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());

        //7. 写入到数据通道, 返回给客户端
        bufferedOutputStream.write(bytes);
        socket.shutdownOutput();

        //8. 关闭相关的资源
        bufferedInputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务端退出...");

    }
}
